/**
 * @file gzipfiles.cpp
 * @author your name (you@domain.com)
 * @brief 什么样的文件才叫历史文件，所以我们需要指定一个时间，当前时刻30分钟
 * @version 0.1
 * @date 2024-04-28
 *
 * @copyright Copyright (c) 2024
 *
 */
#include <stdio.h>
#include "../../public/_public.h"
void EXIT(int sig);
int main(int argc, char *argv[])
{
    // 自己进程名 指定的文件夹，什么样类型文件，超时时间

    // 程序的帮助。
    if (argc != 4)
    {
        printf("\n");
        printf("Using:/project/tools1/bin/gzipfiles pathname matchstr timeout\n\n");

        printf("Example:/project/tools1/bin/gzipfiles /log/idc \"*.log,20*\" 0.02\n");
        printf("        /project/tools1/bin/gzipfiles /tmp/idc/surfdata \"*.xml,*.json\" 0.01\n");
        printf("        /project/tools1/bin/procctl 300 /project/tools1/bin/gzipfiles /log/idc \"*.log,20*\" 0.02\n"); // 222222.log.20xxxxxxxx
        printf("        /project/tools1/bin/procctl 300 /project/tools1/bin/gzipfiles /tmp/idc/surfdata \"*.xml,*.json\" 0.01\n\n");

        printf("这是一个工具程序，用于压缩历史的数据文件或日志文件。\n");
        printf("本程序把pathname目录及子目录中timeout天之前的匹配matchstr文件全部压缩，timeout可以是小数。\n");
        printf("本程序不写日志文件，也不会在控制台输出任何信息。\n");
        printf("本程序调用/usr/bin/gzip命令压缩文件。\n\n\n");

        return -1;
    }
    //中断处理函数
    signal(SIGINT,EXIT);  signal(SIGTERM,EXIT);
    // 获取文件超时的时间点。
    char strTimeOut[21];

    LocalTime(strTimeOut, "yyyy-mm-dd hh24:mi:ss", 0 - (int)(atof(argv[3]) * 24 * 60 * 60));

    //递归打开文件夹--->寻找找符合条件的文件-->检查时间-->系统函数压缩

    char strCmd[1024];      //使用linux命令压缩：tar -zaf 文件全路径名  //使用系统函数删除，使用Linux命令删除 rm -rf 文件全路经

    // 打开文件夹
    // 遍历文件夹中的文件
    // 压缩
    CDir Dir;
    Dir.OpenDir(argv[1], argv[2], 10000, true, false);
    
    while (true)
    {
        if (false == Dir.ReadDir())
        {
            break;
        }
        // 与超时的时间点比较，如果更早，就需要压缩
        if ((strcmp(Dir.m_ModifyTime, strTimeOut) < 0) && (MatchStr(Dir.m_FileName, "*.gz") == false))
        {
            // 压缩文件，调用操作系统的gzip命令。
            SNPRINTF(strCmd, sizeof(strCmd), 1000, "/usr/bin/gzip -f %s 1>/dev/null 2>/dev/null", Dir.m_FullFileName);
            if (system(strCmd) == 0)
                printf("gzip %s ok.\n", Dir.m_FullFileName);
            else
                printf("gzip %s failed.\n", Dir.m_FullFileName);
        }
    }
    return 0;
}

void EXIT(int sig)
{
  printf("程序退出，sig=%d\n\n",sig);

  exit(0);
}